import axios from 'axios'
import { useToken } from '@/stores/user'
import router from '@/router'
import { ElMessage } from 'element-plus'
import 'element-plus/dist/index.css'
import qs from 'qs'

const http = axios.create({
  // TODO 1. 基础地址，超时时间
  baseURL: 'https://wofo.shuchen.fun',
  timeout: 10000,
})

// 请求拦截器
http.interceptors.request.use(
  function (config) {
    // console.log('cccccccc', config)
    // TODO 2. 携带token
    const useTokenStore = useToken()
    if (useTokenStore.token) {
      config.headers.autograph = useTokenStore.token
    }

    return config
  },
  function (error) {
    return Promise.reject(error)
  },
)

// 响应拦截器
// 第一个函数处理的是业务逻辑上成功的响应，而第二个函数处理的是HTTP请求层面上的错误响应。
http.interceptors.response.use(
  function (response) {
    console.log('响应拦截器', response)
    console.log('响应拦截器', response.data.data)
    // TODO 3. 处理业务失败
    if (response.data.code == 200) {
      return response.data.data
    } else {
      ElMessage({
        message: response.data.msg || '服务器异常',
        type: 'error',
        offset: 300,
      })
      return Promise.reject(response.data)
    }
  },
  function (error) {
    // TODO 5. 处理401错误
    // 特殊的错误情况 => 401 权限不足 或 token 过期 => 拦截到登录
    if (error.response?.status === 401) {
      router.push('/login')
    }

    // 错误的默认情况 => 主要给提示
    ElMessage({
      message: error.response.data.message || error.response.data.msg || '服务器异常',
      type: 'error',
      offset: 300,
    })
    return Promise.reject(error)
  },
)

// export default http

/**
 * 封装请求方式
 */
const request = {
  /**
   * @name: 封装axios get方法
   * @desc: 描述
   * @author: camellia
   * @email: guanchao_gc@qq.com
   * @date: 2020-12-21
   * @param url 请求连接
   * @param params 请求参数
   * @param callback 回调方法
   */
  get<T = any>(url: string, params: Record<string, any> = {}, callback?: any) {
    return new Promise<T>((resolve, reject) => {
      http
        .get(url, {
          params: params,
        })
        .then((res) => {
          const data = res.data ? res.data : res
          if (callback) {
            resolve(callback(data))
          } else {
            resolve(data)
          }
        })
        .catch((err) => {
          reject(err)
        })
    })
  },

  /**
   * @name: 封装axios post方法
   * @desc: 描述
   * @author: camellia
   * @email: guanchao_gc@qq.com
   * @date: 2020-12-21
   * @param url 请求连接
   * @param params 请求参数
   * @param callback 回调方法
   */
  post(url: string, params: any, callback?: any) {
    return new Promise((resolve, reject) => {
      http
        .post(url, qs.stringify(params))
        .then((res) => {
          console.log('post请求返回的数据', res)
          const data = res.data ? res.data : res
          if (callback) {
            resolve(callback(data))
          } else {
            resolve(data)
          }
        })
        .catch((err) => {
          reject(err)
        })
    })
  },
}
export default request
